home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
201-225
/
disk_203
/
examples
/
startups
/
startup.asm
< prev
next >
Wrap
Assembly Source File
|
1992-05-06
|
8KB
|
276 lines
;=============================Startup.asm==============================
;For Workbench programs, or CLI programs with or without command line para-
;meters. (Allows arguments in quotes on the CLI). Also can be modified to
;exclude argument parsing, standard IO, and C exit capability. Assembled
;with Inovatronics CAPE assembler.
;Modified from Astartup.asm by Bryce Nesbitt. Additional Mods by Jeff Glatt.
SMALLOBJ ;CAPE directive for PC-relative addressing replaces absolute
;************** Included Files *******************
INCLUDE "allsyms.i" ;CAPE include file of all Amiga system variables
;****************** Imported *************************
XREF _main ; C/asm code entry point
;**********************************************************
;
; Standard Program Entry Point (if MAXARGS is not 0)
;
; main (argc, argv)
; int argc; ;Passed as 32 bits. 0=from Workbench
; char *argv[]; ;Passed as 32 bits. If from workbench,
; ;then this is the WB message pointer.
;
; The next 3 equates determine what code gets included during assembly.
MAXARGS equ 31 ;max # of CLI arguments parsed (If 0, then doesn't create
;the argv and argc arrays, or pass parameters to _main. It
;will delete the parsing code during assembly.)
Cexit equ 1 ;If 0, then only exit point for assembly via an rts in main
;or a jsr exit with the return code in d0. No C exit point
;is supported.
standard equ 1 ;If 0, doesn't set up stdin, stdout, stderr, and errno.
SECTION StartUpCode,CODE
XDEF _startup,_BUFFER,exit
_BUFFER:
_startup:
move.l d0,d6 ;dosCmdLen
move.l a0,a2 ;dosCmdBuf
lea initialSP,a3
;---Get stack address
move.l sp,(a3)+ ; initialSP
;---Get Exec library base
movea.l $00000004,a6
move.l a6,(a3)+ ;_SysBase
;------ Open the DOS library:
lea DOSName,a1
jsr _LVOOpenLibrary(a6) ; Look ma, no error check!
move.l d0,(a3)+ ; _DOSBase
movea.l d0,a5
;------ get the address of our task
movea.l ThisTask(a6),a4
move.l a4,(a3)+ ;_ThisTask
;------ are we running as a son of Workbench?
move.l pr_CLI(a4),d0
beq fromWorkbench
clr.l (a3)+ ; returnMsg
;=======================================================================
;====== CLI Startup Code ===============================================
;=======================================================================
IFNE MAXARGS
;------ find command name:
fromCLI:
movea.l pr_CLI(a4),a0
adda.l a0,a0 ; bcpl pointer conversion
adda.l a0,a0
movea.l cli_CommandName(a0),a0
adda.l a0,a0 ; bcpl pointer conversion
adda.l a0,a0
;------ create buffer and array:
lea _argvBuffer,a4
lea _argvArray,a1
moveq #1,d2 ; param counter
;------ fetch command name:
moveq #0,d0
move.b (a0)+,d0 ; size of command name
move.l a4,(a1)+ ; ptr to command name
bra.s DoC
CMD move.b (a0)+,(a4)+
DoC Dbra d0,CMD
clr.b (a4)+
;------ collect parameters:
;------ skip control characters and leading spaces:
moveq #MAXARGS-1,d3
moveq #' ',d0
moveq #'"',d4
parmloopa:
move.b (a2)+,d1
subq.l #1,d6
ble.s parmExit ;last char to process
cmp.b d0,d1
ble.s parmloopa ;if not $21 to $7F
movea.l a4,a0 ;save beginning of arg
;---check for quoted string
cmp.b d4,d1
bne.s PR
;---process quoted string (copy chars up to control or " char, or no
; more chars in the command line
QU move.b (a2)+,d1
cmp.b d0,d1
blt.s nxP ;if control char
cmp.b d4,d1
beq.s nxP ;if end quote
move.b d1,(a4)+
subq.l #1,d6
bge.s QU
bra.s nxP
;------ copy parameter up to a space or control char
PR move.b d1,(a4)+
move.b (a2)+,d1
subq.l #1,d6
cmp.b d0,d1
bgt.s PR
nxP clr.b (a4)+ ;Null terminate
addq.w #1,d2
move.l a0,(a1)+
Dbra d3,parmloopa
;------ Clear out ends (All Done)
parmExit:
clr.b (a4)
clr.l (a1)
;---push passed values to _main
pea _argvArray ; Arg array pointer
move.l d2,-(sp) ; Arg count
ENDC
IFNE standard
;------ get standard input handle:
movea.l a5,a6 ; Get _DOSBase
jsr _LVOInput(a6)
move.l d0,(a3)+ ; _stdin
;------ get standard output handle:
jsr _LVOOutput(a6)
move.l d0,(a3)+ ; _stdout
move.l d0,(a3)+ ; _stderr
ENDC
;------ call C main entry point
bra.s domain
;=======================================================================
;====== Workbench Startup Code =========================================
;=======================================================================
;------ we are now set up. wait for a message from our starter
fromWorkbench:
;[a4=ThisTask]
;[a5=_DOSBase]
lea pr_MsgPort(a4),a0 ; our process base
jsr _LVOWaitPort(a6)
lea pr_MsgPort(a4),a0 ; our process base
jsr _LVOGetMsg(a6)
;------ save the message so we can return it later
move.l d0,(a3)+ ; set returnMsg. NOTE: no ReplyMsg yet!
IFNE MAXARGS
;------ push argc and argv. if argc = 0 program came from
;------ Workbench, and argv will have the WB message address.
move.l d0,-(SP) ; set argv to the WB message
clr.l -(SP) ; set argc to 0
ENDC
;------ get the first argument
;[d0=WBMessage]
movea.l a5,a6 ;Get _DOSBase
movea.l d0,a2
move.l sm_ArgList(a2),d0
beq.s docons
;------ and set the current directory to the same directory
movea.l d0,a0
move.l wa_Lock(a0),d1
jsr _LVOCurrentDir(a6)
docons: ;------ ignore the toolwindow argument
domain:
jsr _main
moveq #0,d0 ; Successful return code
IFNE Cexit
XDEF _exit
bra.s exit
;************************************************************************
; C Program exit(returncode) Function
_exit: move.l 4(sp),d0 ; extract return code
ENDC
exit: move.l d0,d2 ; save return code
lea initialSP,a3 ; set "frame pointer"
move.l (a3)+,sp ; restore stack pointer
;------ close DOS library:
movea.l (a3)+,a6
movea.l (a3),a1
jsr _LVOCloseLibrary(a6)
;------ if we ran from CLI, skip workbench cleanup:
addq.l #8,a3 ;skip ThisTask
move.l (a3),d0
beq.s exitToDOS
;------ return the startup message to our parent
;------ we forbid so workbench can't UnLoadSeg() us
;------ before we are done:
addq.b #1,TDNestCnt(a6)
;[d0=returnMsg]
movea.l d0,a1
jsr _LVOReplyMsg(a6)
;------ this rts sends us back to DOS:
exitToDOS:
move.l d2,d0
rts
;******************* DATA ***********************
XDEF _SysBase,_DOSBase,_returnMsg,_ThisTask
initialSP dc.l 0 ; initial stack pointer
_SysBase dc.l 0 ; exec library base pointer
_DOSBase dc.l 0 ; dos library base pointer
_ThisTask dc.l 0 ; address of this task
_returnMsg dc.l 0 ; Workbench message, or zero for CLI startup
IFNE standard
XDEF _errno,_stdin,_stdout,_stderr
_stdin dc.l 0 ; in handle
_stdout dc.l 0 ; out handle
_stderr dc.l 0 ; error handle
_errno dc.l 0 ; error number from OS routines
ENDC
IFNE MAXARGS
XDEF _argvArray,_argvBuffer
_argvArray ds.l MAXARGS+1 ;maximum args (parameters) on CLI line
_argvBuffer ds.b 256 ;256 characters maximum on a CLI line
ENDC
DOSName: dc.b 'dos.library',0
END